﻿// 3595. 二叉排序树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory.h>

using namespace std;
/*
https://www.acwing.com/problem/content/3598/

二叉排序树，也称为二叉查找树。

可以是一颗空树，也可以是一颗具有如下特性的非空二叉树：

若左子树非空，则左子树上所有节点关键字值均不大于根节点的关键字值；
若右子树非空，则右子树上所有节点关键字值均不小于根节点的关键字值；
左、右子树本身也是一颗二叉排序树。
现在给你 N个关键字值各不相同的节点。

要求你将这些节点按顺序插入一个初始为空树的二叉排序树中。

每次成功插入一个节点后，求其相应的父亲节点的关键字值，如果没有父亲节点，则输出 −1。

输入格式
第一行包含整数 N，表示待插入的节点数。

第二行包含 N个互不相同的正整数，表示要顺序插入节点的关键字值。

数据范围
1≤N≤100
，
节点关键字值取值范围 [1,108]

输入样例：
5
2 5 1 3 4
输出样例：
-1
2
2
5
3
*/

const int N = 160;
struct NODE {
    int v, l, r;
}nodes[N];
int n, idx;

int insert(int x) {
    if (nodes[0].v == -1) {
        nodes[0].v = x;
        idx++;
        return -1;
    }
    int curr = 0;
    while (nodes[curr].v != -1) {
        if (x > nodes[curr].v) {
            if (nodes[curr].r != -1) {
                curr = nodes[curr].r;
            }
            else {
                nodes[idx].v = x;
                nodes[curr].r = idx;
                idx++;
                return  nodes[curr].v;
            }
        }
        else {
            if (nodes[curr].l != -1) {
                curr = nodes[curr].l;
            }
            else {
                nodes[idx].v = x;
                nodes[curr].l = idx;
                idx++;
                return nodes[curr].v;
            }
        }
    }

    return -1;
}

int main()
{
    memset(nodes, -1, sizeof nodes);
    cin >> n;
    for (int i = 0; i < n; i++) {
        int t; cin >> t;
        cout << insert(t) << endl;
    }

    return 0;
}

 